package handlers

import (
	"encoding/json"
	"fmt"
	"iot/mqttmodule"
	"iot/ttsclient" 
	"log"
	"strings"
)

// TTS 请求的处理函数
func TTSRequestHandler(topic string, payloadData map[string]interface{}) {
	if ttsData, ttsExists := payloadData["tts-request"].(map[string]interface{}); ttsExists {
		filename, filenameExists := ttsData["filename"].(string)
		text, textExists := ttsData["text"].(string)
		if filenameExists && textExists {
			fmt.Printf("收到 TTS 请求，filename: %s, text: %s\n", filename, text)
			// 调用 TTS 请求处理
			requset_tts_server(filename, text)
		} else {
			fmt.Println("未找到 filename 或 text 字段")
		}
	} else {
		fmt.Println("未找到 tts-request 字段")
	}
}

// 处理 TTS 请求，filename 和 data 均为字符串类型
func requset_tts_server(filename string, data string) {
	// 获取 TTS 客户端实例
	client, err := ttsclient.GetTTSClient("localhost:7002")
	if err != nil {
		log.Fatalf("获取 TTS 客户端失败: %v", err)
	}

	// 发送 TTS 请求
	client.SendTTSRequest(filename, data)

	// 监听 TTS 响应
	go func() {
		for response := range client.GetResponseChan() {
			fmt.Printf("收到 TTS 响应: %s\n", response)
			if strings.Contains(response, "done") {
				// 提取任务 index
				index := extractIndex(response)
				if index != "" {
					// 构建并发布成功任务的 JSON 消息
					notify_tts_res(index)
				}
			}
		}
	}()
}

func notify_tts_res(filename string) {

	// 修改响应并构建为 JSON 格式
	data := map[string]interface{}{
		"tts-res": map[string]interface{}{
			"filename": filename,
			"url":      fmt.Sprintf("192.168.31.223:7001/download/%s.mp3", filename),
		},
	}
	// 将构建的 map 转换为 JSON 格式的字符串
	jsonData, err := json.Marshal(data)
	if err != nil {
		fmt.Printf("构建 JSON 失败: %v\n", err)
		return
	}
	// 将 jsonData 转换为 string
	jsonStr := string(jsonData)
	// 获取共享的 MQTT 客户端实例
	client := mqttmodule.GetMQTTClient()
	if client == nil {
		log.Println("MQTT 客户端尚未初始化")
		return
	}

	// 发布消息
	err = client.Publish("general/tts", jsonStr, 0, false)
	if err != nil {
		log.Printf("发布消息失败: %v\n", err)
	}
	fmt.Println("Message published from example module")
}

// extractIndex 提取响应中的任务 index
func extractIndex(response string) string {
	// 假设消息格式为 "Task {index} done" 或 "Task {index} failed"
	parts := strings.Fields(response)
	if len(parts) >= 2 {
		return parts[1] // 提取 index
	}
	return ""
}
